#define _CRT_SECURE_NO_WARNINGS 1
typedef struct
{
    Queue q1;
    Queue q2;
} MyStack;

//栈的初始化
MyStack* myStackCreate()
{
    MyStack* ms = (MyStack*)malloc(sizeof(MyStack));
    if (ms == NULL)
    {
        perror("mallco");
        return NULL;
    }
    QueueInit(&(ms->q1));
    QueueInit(&(ms->q2));

    return ms;
}

//插入数据
void myStackPush(MyStack* obj, int x)
{
    //往非空的队列里面插入
    if (!QueueEmpty(&(obj->q1)))
    {
        QueuePush(&(obj->q1), x);
    }
    else
    {
        QueuePush(&(obj->q2), x);
    }
}

//删除数据
int myStackPop(MyStack* obj)
{
    //删除数据首先要将非空队列的前size-1个元素复制到空队列中
    //假设法
    Queue* empty = &(obj->q1);
    Queue* noempty = &(obj->q2);
    if (!QueueEmpty(&(obj->q1)))
    {
        empty = &(obj->q2);
        noempty = &(obj->q1);
    }

    //此时empty就是空队列，noempty就是非空队列
    while (GetQueueSize(noempty) > 1)
    {
        //将前size-1个元素复制到非空队列
        QueuePush(empty, GetQueueFront(noempty));
        QueuePop(noempty);
    }
    //此时，noempty中剩余的就是最后push的元素,即栈顶元素
    int top = GetQueueFront(noempty);
    QueuePop(noempty);

    return top;
}

//返回栈顶数据
int myStackTop(MyStack* obj)
{
    //栈顶数据在非空队列中
    if (!QueueEmpty(&(obj->q1)))
    {
        return GetQueueBack(&(obj->q1));
    }
    else
    {
        return GetQueueBack(&(obj->q2));
    }
}

//判空
bool myStackEmpty(MyStack* obj)
{
    return QueueEmpty(&(obj->q1)) && QueueEmpty(&(obj->q2));
}

//销毁栈
void myStackFree(MyStack* obj)
{
    //销毁栈其实就是销毁构成栈的两个队列
    QueueDestroy(&(obj->q1));
    QueueDestroy(&(obj->q2));

    free(obj);
}

int main()
{
    //初始化
    MyStack* ms = myStackCreate();

    //插入
    myStackPush(ms, 1);
    myStackPush(ms, 2);

    //获取栈顶元素
    int top = myStackTop(ms);
    printf("%d\n", top);

    ////删除栈顶元素
    //top = myStackPop(ms);
    //printf("%d\n", top);

    //if (myStackEmpty(ms))
    //{
    //    printf("空\n");
    //}
    //else
    //{
    //    printf("非空\n");
    //}

    //myStackFree(ms);
    return 0;
}